{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ebd66700",
   "metadata": {},
   "source": [
    "## Demo_CM\n",
    "This is a demo for visualizing the Confusion Matrix of a Neuron Network\n",
    "\n",
    "To run this demo from scratch, you need first generate a BadNet attack result by using the following cell"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b950f4fc",
   "metadata": {},
   "outputs": [],
   "source": [
    "! python ../../attack/badnet.py --save_folder_name badnet_demo"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f81f973",
   "metadata": {},
   "source": [
    "or run the following command in your terminal\n",
    "\n",
    "```python attack/badnet.py --save_folder_name badnet_demo```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87bd9f5a",
   "metadata": {},
   "source": [
    "### Step 1: Import modules and set arguments"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "71b7087b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys, os\n",
    "import yaml\n",
    "import torch\n",
    "import numpy as np\n",
    "import torchvision.transforms as transforms\n",
    "\n",
    "sys.path.append(\"../\")\n",
    "sys.path.append(\"../../\")\n",
    "sys.path.append(os.getcwd())\n",
    "from visual_utils import *\n",
    "from utils.aggregate_block.dataset_and_transform_generate import (\n",
    "    get_transform,\n",
    "    get_dataset_denormalization,\n",
    ")\n",
    "from utils.aggregate_block.fix_random import fix_random\n",
    "from utils.aggregate_block.model_trainer_generate import generate_cls_model\n",
    "from utils.save_load_attack import load_attack_result\n",
    "from utils.defense_utils.dbd.model.utils import (\n",
    "    get_network_dbd,\n",
    "    load_state,\n",
    "    get_criterion,\n",
    "    get_optimizer,\n",
    "    get_scheduler,\n",
    ")\n",
    "from utils.defense_utils.dbd.model.model import SelfModel, LinearModel\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2fb719c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "### Basic setting: args\n",
    "args = get_args(True)\n",
    "\n",
    "########## For Demo Only ##########\n",
    "args.yaml_path = \"../../\"+args.yaml_path\n",
    "args.result_file_attack = \"badnet_demo\"\n",
    "######## End For Demo Only ##########\n",
    "\n",
    "with open(args.yaml_path, \"r\") as stream:\n",
    "    config = yaml.safe_load(stream)\n",
    "config.update({k: v for k, v in args.__dict__.items() if v is not None})\n",
    "args.__dict__ = config\n",
    "args = preprocess_args(args)\n",
    "fix_random(int(args.random_seed))\n",
    "\n",
    "save_path_attack = \"../..//record/\" + args.result_file_attack\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f959b510",
   "metadata": {},
   "source": [
    "### Step 2: Load data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b8b67ac9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:root:save_path MUST have 'record' in its abspath, and data_path in attack result MUST have 'data' in its path\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n",
      "loading...\n",
      "Create visualization dataset with \n",
      " \t Dataset: clean_train \n",
      " \t Number of samples: 50000  \n",
      " \t Selected classes: [0 1 2 3 4 5 6 7 8 9]\n"
     ]
    }
   ],
   "source": [
    "# Load result\n",
    "result_attack = load_attack_result(save_path_attack + \"/attack_result.pt\")\n",
    "\n",
    "# Select all classes and all samples\n",
    "selected_classes = np.arange(args.num_classes)\n",
    "\n",
    "# keep the same transforms for train and test dataset for better visualization\n",
    "result_attack[\"clean_train\"].wrap_img_transform = result_attack[\"clean_test\"].wrap_img_transform \n",
    "result_attack[\"bd_train\"].wrap_img_transform = result_attack[\"bd_test\"].wrap_img_transform \n",
    "\n",
    "args.visual_dataset = 'clean_train'\n",
    "# Create dataset\n",
    "if args.visual_dataset == 'clean_train':\n",
    "    visual_dataset = result_attack[\"clean_train\"]\n",
    "elif args.visual_dataset == 'clean_test':\n",
    "    visual_dataset = result_attack[\"clean_test\"]\n",
    "elif args.visual_dataset == 'bd_train':  \n",
    "    visual_dataset = result_attack[\"bd_train\"]\n",
    "elif args.visual_dataset == 'bd_test':\n",
    "    visual_dataset = result_attack[\"bd_test\"]\n",
    "else:\n",
    "    assert False, \"Illegal vis_class\"\n",
    "\n",
    "print(f'Create visualization dataset with \\n \\t Dataset: {args.visual_dataset} \\n \\t Number of samples: {len(visual_dataset)}  \\n \\t Selected classes: {selected_classes}')\n",
    "\n",
    "# Create data loader\n",
    "data_loader = torch.utils.data.DataLoader(\n",
    "    visual_dataset, batch_size=args.batch_size, num_workers=args.num_workers, shuffle=False\n",
    ")\n",
    "\n",
    "# Create denormalization function\n",
    "for trans_t in data_loader.dataset.wrap_img_transform.transforms:\n",
    "    if isinstance(trans_t, transforms.Normalize):\n",
    "        denormalizer = get_dataset_denormalization(trans_t)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3f652e5",
   "metadata": {},
   "source": [
    "### Step 3: Load Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "ff67e7b8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Load model preactresnet18 from badnet_demo\n"
     ]
    }
   ],
   "source": [
    "# Load model\n",
    "model_visual = generate_cls_model(args.model, args.num_classes)\n",
    "model_visual.load_state_dict(result_attack[\"model\"])\n",
    "model_visual.to(args.device)\n",
    "# !!! Important to set eval mode !!!\n",
    "model_visual.eval()\n",
    "print(f\"Load model {args.model} from {args.result_file_attack}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc952077",
   "metadata": {},
   "source": [
    "### Step 4: Plot Confusion Matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "94612903",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plotting Confusion Matrix\n",
      "Normalized confusion matrix\n",
      "Test Acc: 95.230%(47615/50000)\n",
      "Test Acc (Target only): 99.980%(4999/5000)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqUAAALICAYAAABGsom2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAACHHUlEQVR4nOzdeXxU9dXH8c8JEXADQkBLEpXNEoggS8AVcRdl0yKCIoLgjgL62Lorpa37Alaq1bpQREFcyirgBgpV2RRUQA0SlIRWQARpNchwnj/ukGYIm0ByL5Pv29e8zJ37uzPncLOc+S33mrsjIiIiIhKmlLADEBERERFRUSoiIiIioVNRKiIiIiKhU1EqIiIiIqFTUSoiIiIioUsNOwARERGRiq5StSPcN/0YdhgA+I+rprp7+/J+XxWlIiIiIiHzTT9SpdEFYYcBwE8fD68Vxvtq+F5EREREQqeeUhEREZHQGVjF7ius2NmLiIiISCSoKBURERGR0Gn4XkRERCRsBpiFHUWo1FMqIiIiIqFTUSoiIiIiodPwvYiIiEgUaPW9iIiIiEi41FMqIiIiEgVa6CQiIiIiEi4VpSIiIiISOg3fi4iIiIROtxmt2NmLiIiISCSoKBURERGR0Gn4XkRERCQKtPpeRERERCRc6ikVERERCZuhhU5hByAiIiIioqJUREREREKn4XsRERGR0JkWOoUdgIiIiIiIilIRERERCZ2G70VERESiQKvvRURERETCpZ5SERERkSjQQicRERERkXCpKBURERGR0Gn4XkRERCR0poVOYQcgIiIiIqKiVERERERCp+F7ERERkbAZWn0fdgAiIiIiIipKRURERCR0Gr4XERERiQKtvhcRERERCZd6SkVERERCp+uUVuzsRURERCQSVJSKiIiISOg0fC8iIiISBSm6TqmIiIiISKhUlIqIiIhI6DR8LyIiIhI2Q6vvww5AREREREQ9pSIiIiJRYFroJCIiIiISKhWlIiIiIhI6Dd+LiIiIhE63Ga3Y2YuIiIhIJKgoFREREZHQafheREREJAq0+l5EREREJFzqKRURERGJAi10EhEREREJl4pSEREREQmdhu9FREREwmamhU5hByAiIiIioqJUREREREKn4XsRERGRKNDqexERERGRcKkoFREREZHQafheREREJAq0+l5EREREJFzqKRUREREJnWmh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i6mUYoyY/DGL81dxR9+Tmb+kkEn//IKTmtdlyBWn4Q4zFyxn0NDJ5R7nziTDuUiWPJIhh2TKY0+ZWYW/TqlFbeV2WTOz24DewLfA18B84E3gCeAA4CvgUndfa2bHAE8Bm4EZQK677/AOVy1a5vrbMz8swwzKx/6V980f6mSULD+jUet93V1pp/0+7BD2irVv3bXzRiIVzAnH5DJv3txQflll/Lqp93s0Gvcl+uPZv57n7rnl/b4VracUd/8T8Kdt7Dp2G899Fl/8hJndDMwty9hERESk4kqSz+67rcIVpb9QBzO7heDfaTnQJ9xwRERERJKTitIdcPcxwJiw4xARERFJdipKRURERCIgpYIP34d5i1MREREREUBFqYiIiIhEgIbvRUREREJmUOGvU6qeUhEREREJnXpKRURERCKggneUqqdURERERMKnolREREREQqfhexEREZGwma5Tqp5SEREREQmdilIRERERCZ2G70VEREQiwKjY4/fqKRURERGR0KkoFREREZHQafheREREJGTBbUbDjiJc6ikVERERkdCpp1REREQkAip6T6mKUpGIs4p+M+SIWfvWXWGHsFeknXJn2CHssbXvDAk7BBHZizR8LyIiIiKhU0+piIiISARU9JEx9ZSKiIiISOhUlIqIiIhI6DR8LyIiIhIyXadUPaUiIiIiEgHqKRUREREJm0EFX+eknlIRERERCZ+KUhEREREJnYbvRURERCIgpYKP36unVERERERCp6JUREREREKn4XsRERGRkOk6peopFREREZEIUFEqIiIiIqHT8L2IiIhIBFTwxffqKRURERGRX8bM2pvZ52aWZ2Y376BdVzNzM8vd2Wuqp1REREQkdEYK+0ZXqZlVAoYDZwArgDlmNt7dF23V7mBgIPDhrryuekpFRERE5JdoA+S5+1fuvhEYDXTZRrs/APcBP+3Ki6ooFREREZGSapnZ3BKPK7banwl8U2J7Rfy5YmbWEjjM3Sft6puqKI2YN6dNoU3zJrRq2oihD95Xan9RURF9L7mQVk0bcXq74/h6eX7C/hXffM1hh1Tnz0MfKqeIt23a1Ck0y2lETnZDHrj/3lL7i4qKuPii7uRkN6Tt8cewPD+/eN8D991DTnZDmuU04o1pU8sx6kTJkAMoD4hOHsmQA8AZbRqyYNQAPn1xIDf2bFtq/+GHVmfy0D7M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",
      "text/plain": [
       "<Figure size 720x720 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "############## Confusion Matrix ##################\n",
    "print(\"Plotting Confusion Matrix\")\n",
    "\n",
    "target_class = args.target_class\n",
    "poison_class = args.num_classes\n",
    "class_names = args.class_names\n",
    "\n",
    "# Evaluation\n",
    "criterion = torch.nn.CrossEntropyLoss()\n",
    "total_clean_test, total_clean_correct_test, test_loss = 0, 0, 0\n",
    "target_correct, target_total = 0, 0\n",
    "\n",
    "true_labls = []\n",
    "pred_labels = []\n",
    "for i, (inputs, labels, *other_info) in enumerate(data_loader):\n",
    "    inputs, labels = inputs.to(args.device), labels.to(args.device)\n",
    "    outputs = model_visual(inputs)\n",
    "    loss = criterion(outputs, labels)\n",
    "    test_loss += loss.item()\n",
    "\n",
    "    total_clean_correct_test += torch.sum(torch.argmax(outputs[:], dim=1) == labels[:])\n",
    "    target_correct += torch.sum(\n",
    "        (torch.argmax(outputs[:], dim=1) == target_class) * (labels[:] == target_class)\n",
    "    )\n",
    "    target_total += torch.sum(labels[:] == target_class)\n",
    "\n",
    "    total_clean_test += inputs.shape[0]\n",
    "    avg_acc_clean = float(total_clean_correct_test.item() * 100.0 / total_clean_test)\n",
    "    prediction = torch.argmax(outputs[:], dim=1)\n",
    "    true_labls.append(labels.detach().cpu().numpy())\n",
    "    pred_labels.append(prediction.detach().cpu().numpy())\n",
    "    \n",
    "true_labls = np.concatenate(true_labls)\n",
    "pred_labels = np.concatenate(pred_labels)\n",
    "\n",
    "plot_confusion_matrix(\n",
    "    true_labls,\n",
    "    pred_labels,\n",
    "    classes=class_names,\n",
    "    normalize=True,\n",
    "    title=\"Confusion matrix\",\n",
    "    save_fig_path=None,\n",
    ")\n",
    "\n",
    "print(\n",
    "    \"Test Acc: {:.3f}%({}/{})\".format(\n",
    "        avg_acc_clean, total_clean_correct_test, total_clean_test\n",
    "    )\n",
    ")\n",
    "print(\n",
    "    \"Test Acc (Target only): {:.3f}%({}/{})\".format(\n",
    "        target_correct / target_total * 100.0, target_correct, target_total\n",
    "    )\n",
    ")\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.9.12 ('py38')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.8.13 (default, Oct 21 2022, 23:50:54) \n[GCC 11.2.0]"
  },
  "vscode": {
   "interpreter": {
    "hash": "6869619afde5ccaa692f7f4d174735a0f86b1f7ceee086952855511b0b6edec0"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
